package affichage;


import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import deroulementjeu.Partie;
import deroulementjeu.TypeEquipe;

import regles.Regle;


/**
 * Fenetre qui affiche le panel TerrainView et MenuBas pour jouer au jeu
 * @author Alexis BRASY, Geoffrey LEQUESNE, Sandrine PIRIOU, Michel POPOV
 *
 */
public class JeuView extends JFrame {

    /** Entier nécessaire à la sérialisation */
    private static final long serialVersionUID = 1L;
    /** La vue du terrain */
    private TerrainView pan;
    /** La partie */
    private Partie partie;
    /** La fenêtre contenant le menu principal */
    private Fenetre menuPrinc;
    
	/** La menu barre */
    private JMenuBar menuBar = new JMenuBar();
    /** Le menu "fichier" de la menu barre */
    private JMenu jMenuFichier = new JMenu("Fichier");
    /** Le menu "?" de la menu barre */
    private JMenu jMenuHelp = new JMenu("?");
    
    /** L'item "Sauvegarder" du menu "fichier" */
    private JMenuItem item1 = new JMenuItem("Sauvegarder");
    /** L'item "Menu principal" du menu "fichier" */
    private JMenuItem item2 = new JMenuItem("Menu Principal");
    /** L'item "Quitter" du menu "fichier" */
    private JMenuItem item3 = new JMenuItem("Quitter");
    
    /** L'item "A propos de PikaWar" du menu "?" */
    private JMenuItem item4 = new JMenuItem("À propos de PikaWar");

    /**
     * Le constructeur d'un JeuView
     * @param p la partie
     * @param menuPrinc la fenêtre contenant le menu principal
     * @param chargement le booléen si l'utilisateur a choisi une partie ou non
     */
    public JeuView(Partie p, Fenetre menuPrinc, boolean chargement) {
        this.menuPrinc = menuPrinc;
        this.setTitle("PikaWar");
		
        item1.addActionListener(new SauvegarderListener());
        this.jMenuFichier.add(item1);
        item2.addActionListener(new MenuPrincipListener(this));
        this.jMenuFichier.add(item2);
        item3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.exit(0);
            }				
        });
        this.jMenuFichier.add(item3);
        jMenuFichier.setMnemonic('F');
		
        item4.addActionListener(new CreditsListener());
        this.jMenuHelp.add(item4);
        jMenuHelp.setMnemonic(',');
			
        // L'ordre d'ajout va déterminer l'ordre d'apparition dans le menu de gauche à droite
        // Le premier ajouté sera tout à gauche de la barre de menu et inversement pour le dernier
        this.menuBar.add(jMenuFichier);
		
        this.menuBar.add(jMenuHelp);
			
        this.setJMenuBar(menuBar);
		
        this.setSize(800, 600);

        this.setSize((int) getToolkit().getScreenSize().getWidth(),
                ((int) getToolkit().getScreenSize().getHeight() - 40));
		
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
		
        this.partie = p;
        partie.setJeuView(this);
        pan = new TerrainView(partie, this, false);
        pan.setPreferredSize(
                new Dimension(
                        pan.getTerrain().getNbColonnes()
                                * pan.getCaseTerrainView().get(0).get(0).getHexaWidth()
                                        + pan.getCaseTerrainView().get(0).get(0).getHexaWidth()
                                                / 2,
                                                pan.getTerrain().getNbLignes()
                                                        * pan.getCaseTerrainView().get(0).get(0).getHexaSide()
                                                                + pan.getCaseTerrainView().get(0).get(0).getHexaHeight()
                                                                - pan.getCaseTerrainView().get(0).get(0).getHexaSide()));
    	
        JScrollPane _scroll = new JScrollPane(pan);

        _scroll.setHorizontalScrollBarPolicy(
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        _scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
     		
        this.setLayout(new BorderLayout());
        JPanel south = new JPanel();
 	
        MenuBas menu = new MenuBas(this, pan);

        south.add(menu);
        pan.setMenu2(menu);
    	
        this.getContentPane().add(south, BorderLayout.SOUTH);
        this.getContentPane().add(_scroll, BorderLayout.CENTER);
    	
        // Si on a pas chargé une partie sauvegardée, on demande au joueur de choisir
        // une map de départ pour la nouvelle partie
        if (chargement == false) {
            JFileChooser fileChooser = new JFileChooser("parties/");
            ChoixFichier filtre = new ChoixFichier(".par", "Fichier Partie");
            File file;

            fileChooser.addChoosableFileFilter(filtre);
        	
            if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
                // On ajoute notre filtre sur l'objet fileChooser !
        	
                file = fileChooser.getSelectedFile();
                // Si l'extension est valide
                Regle tmp = partie.getRegle();
                TypeEquipe tmp1 = partie.getTypeJoueur(1);

                partie = partie.charger("parties/" + file.getName());
	        	
                partie.getRegle().setModeScenario(tmp.getModeScenario());
                partie.getRegle().setModeCombat(tmp.getModeCombat());
                partie.getRegle().setRegenPV(tmp.getRegenPV());
                partie.getRegle().setXpMortel(tmp.getXpMortel());
                partie.getRegle().setDepPostMortem(tmp.getDepPostMortem());
                partie.getRegle().setNbPotion(tmp.getNbPotion());
                partie.getRegle().setNivIA(tmp.getNivIA());
                partie.setTypeJoueur(1, tmp1);	        	 
	        	
                partie.init();
	        		
                pan.setTerrain(partie.getTerrain());
                pan.setPartie(partie);
                pan.setCasesAAfficher(
                        partie.getEquipeEnCours().getCasesAffichables());

                partie.setJeuView(this);
	        	
            }
        } else {
            partie.setJeuView(this);
            pan.setTerrain(partie.getTerrain());
            pan.setPartie(partie);
            if (partie.getEquipeEnCours() == null) {
                
            }
            pan.setCasesAAfficher(
                    partie.getEquipeEnCours().getCasesAffichables());
        }
    }
	
    /**
     * Getter de la JFrame contenant le menu principal
     * @return la fenêtre
     */
    public JFrame getMenuPrinc() {
        return this.menuPrinc;
    }
	
    /**
     * La classe qui écoute l'item "sauvegarder" du menu "Fichier" de la menubar
     * @author Alexis BRASY, Geoffrey LEQUESNE, Sandrine PIRIOU, Michel POPOV
     *
     */
    class SauvegarderListener implements ActionListener {

    	/**
    	 * Redéfinition de la méthode actionPerformed
    	 */
        @Override
        public void actionPerformed(ActionEvent arg0) {
            JFileChooser fileChooser = new JFileChooser("partiesSauv/");
            ChoixFichier filtre = new ChoixFichier(".sav",
                    "Fichier Partie Sauvegardée");
            File file;

            fileChooser.addChoosableFileFilter(filtre);
        	
            if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
                // On ajoute notre filtre sur l'objet fileChooser !
                file = fileChooser.getSelectedFile();
                // Si l'extension est valide
                if (fileChooser.getFileFilter().accept(file)) {
                    JeuView tmp = partie.getJeuView();

                    partie.setJeuView(null);

                    partie.sauvegarde("partiesSauv/" + file.getName());
                    partie.setJeuView(tmp);
                } else {
                    
                }
            }
        }
		
    }
	

    /**
     * La classe qui écoute l'item "Menu Principal" du menu "Fichier" de la menubar
     * @author Alexis BRASY, Geoffrey LEQUESNE, Sandrine PIRIOU, Michel POPOV
     *
     */
    class MenuPrincipListener implements ActionListener {
        private JeuView jv;
		
        /**
         * Constructeur du MenuPrincipListener
         * @param j le JeuView associé
         */
        public MenuPrincipListener(JeuView j) {
            this.jv = j;
        }
		
        /**
         * Redéfinition de la méthode actionPerformed
         */
        @Override
        public void actionPerformed(ActionEvent e) {
            jv.setVisible(false);
            menuPrinc.setVisible(true);
            menuPrinc.lancerMusiqueMenu();
        }
		
    }
	

    /**
     * La classe qui écoute l'item "A propos de nPikaWar" du menu "?" de la menubar
     * @author Alexis BRASY, Geoffrey LEQUESNE, Sandrine PIRIOU, Michel POPOV
     *
     */
    class CreditsListener implements ActionListener {

    	/**
    	 * Redéfinition de la méthode actionPerformed
    	 */
        @Override
        public void actionPerformed(ActionEvent e) {}
		
    }
}
